package dgdb2d;

import java.io.Serializable;
import java.util.UUID;
import java.util.Vector;

import com.tinkerpop.blueprints.pgm.Edge;
import com.tinkerpop.blueprints.pgm.Vertex;

/**
 * Klasa opisujaca wierzcholek grafu. Implementowany jest interfejs Vertex standardu Blueprints.
 * 
 * @author Dominik Zielinski, Patryk Chaber
 * @version 0.42
 */
public class GDBVertex extends GDBElement implements Vertex, Serializable {

	private static final long serialVersionUID = 4141808050082561433L;
	
	/**
	 * Konstruktor bezparametrowy. ID elementu jest generowane losowo.
	 */
	public GDBVertex() {
		this(UUID.randomUUID().toString());
	}

	/**
	 * Konstruktor inicjalizujacy ID elementu wybrana wartoscia.
	 * 
	 * @param id Wybrane ID elementu.
	 */
	public GDBVertex(String id) {
		super(id);
	}

	/**
	 * Konstruktor tworzacy obiekt na podstawie danych zawartych w drzewie XML.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param root Korzen drzewa XML.
	 */
	public GDBVertex(org.jdom2.Element root) {
		throw new IllegalArgumentException();
	}

	@Override
	public Iterable<Edge> getOutEdges(String... labels) {
		return ClientGDB.gdb.getVertexOutEdges(this.getId(),labels);
	}

	/**
	 * Dodanie obiektu krawedzi do listy krawedzi wychodzacych z wezla.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param edge Krawedz wychodzaca z wezla.
	 */
	public void addOutEdge(String id, String label) {
		throw new IllegalArgumentException();
	}

	/**
	 * Usuniecie krawedzi z listy krawedzi wychodzacych z wezla.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param id Identyfikator krawedzi do usuniecia z listy.
	 */
	public void removeOutEdge(String id) {
		throw new IllegalArgumentException();
	}

	@Override
	public Iterable<Edge> getInEdges(String... labels) {
		return ClientGDB.gdb.getVertexInEdges(this.getId(),labels);
	}

	/**
	 * Dodanie obiektu krawedzi do listy krawedzi wchodzacych do wezla.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param edge Krawedz wchodzaca do wezla.
	 */
	public void addInEdge(String id, String label) {
		throw new IllegalArgumentException();
	}

	/**
	 * Usuniecie krawedzi z listy krawedzi wchodzacych do wezla.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Metoda ta nie jest wywolywana z poziomu klienta.
	 * 
	 * @param id Identyfikator krawedzi do usuniecia z listy.
	 */
	public void removeInEdge(String id) {
		throw new IllegalArgumentException();
	}

	@Override
	protected void save() {
		throw new IllegalArgumentException();
	}
	
	/**
	 * Klasa opisujaca krawedz powiazana z wezlem. Przechowywane jest ID oraz etykieta krawedzi.
	 * Implementacja pozostawiona ze wzgledu na mechanizm RMI. Klasa ta nie jest wykorzystywana z poziomu klienta.
	 */
	@SuppressWarnings("unused")
	private class EdgeEntry implements Serializable {

		private static final long serialVersionUID = -1628593779932852531L;
		public String id;
		public String label;

		/**
		 * Konstruktor inicjalizujacy.
		 * 
		 * @param id    ID opisywanej krawedzi.
		 * @param label Etykieta opisywanej krawedzi.
		 */
		public EdgeEntry(String id, String label) {
			this.id = id;
			this.label = label;
		}

		@Override
		public String toString() {
			return label + " " + this.id.toString();
		}
	}
}
